package mobile.game.core.support;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Properties;

/**
 * @author g
 *
 * 节点设置
 */
public class ServerDistrConfig {
	/* 配置文件名称 */
	private static final String CONFIG_NAME = "acDistr.properties";
	
	/* 配置前缀 */
	private static final String PREFIX_NODE_ADDR = "node.addr";
	private static final String PREFIX_PORT_STARTWITH = "port.startwith";
	private static final String PREFIX_SERV_STARTWITH = "serv.startwith";
	
	// node地址
	private static final Map<String, String> NODE_ADDR = new HashMap<>();
	// port所属的node
	private static final Map<String, String> PORT_STARTWITH = new HashMap<>();
	// service所属的port
	private static final Map<String, String> SERV_STARTWITH = new HashMap<>();
	
	/* conn前缀 */
	// 连接服务器node前缀
	public static final String NODE_CONN_PREFIX = "conn";
	// 连接服务器port前缀
	public static final String PORT_CONN_PREFIX = "conn";
	
	/* world前缀 */
	// world服务器node前缀
	public static final String NODE_WORLD_PREFIX = "world";
	// 游戏业务Port前缀
	public static final String PORT_GAME_PREFIX = "game";
	// 游戏地图Port前缀
	public static final String PORT_STAGE_PREFIX = "stage";
	
	/* platform前缀 */
	// 登录服务Port前缀
	public static final String PORT_LOGIN_PREFIX = "login";
	// HTTP服务Port前缀
	public static final String PORT_HTTP_PREFIX = "http";
	// Gift服务Port前缀
	public static final String PORT_GIFT_PREFIX = "gift";
	
	/* node名称 */
	// 默认主控游戏服务node
	public static final String NODE_DEFAULT = "world0";
	// 数据库node名称
	public static final String NODE_DB = "db";
	// 平台node名称
	public static final String NODE_PLATFORM = "platform";
	
	/* port名称 */
	/* world上的port */
	// 默认主控游戏服务port
	public static final String PORT_DEFAULT = "port0";
	
	/* db上的port */
	// 数据库默认port名称
	public static final String PORT_DB_COMMON = "dbCommon";
	// 数据库高耗操作port名称
	public static final String PORT_DB_LARGE = "dbLarge";
	// ID分配port
	public static final String PORT_ID_ALLOT = "idAllot";
	
	/* service名称 */
	/* db上的服务 */
	// 常规数据服务
	public static final String SERV_DB_COMMON = "dbCommon";
	// 高消耗数据服务
	public static final String SERV_DB_LARGE = "dbLarge";
	// ID分配服务
	public static final String SERV_ID_ALLOT = "idAllot";
	
	/* conn上的服务 */
	// 连接总服务
	public static final String SERV_CONN = "conn";
	
	/* platform上的服务 */
	// 登录服务
	public static final String SERV_LOGIN = "login";
	// 礼包服务
	public static final String SERV_GIFT = "gift";
	
	/* world上的服务 */
	// 选人服务
	public static final String SERV_GATE = "gate";
	// 对平台服务器提供服务
	public static final String SERV_WORLD_PF = "worldPF";
	// 测试服务的名字
	public static final String SERV_TEST = "test";
	// 玩家创建申请服务的名字
	public static final String SERV_HUMAN_CREATE_APPLY = "humanCreateApply";
	// 全局地图信息服务的名字
	public static final String SERV_STAGE_GLOBAL = "stageGlobal";
	// 全局玩家信息服务的名字
	public static final String SERV_HUMAN_GLOBAL = "humanGlobal";
	// 地图默认服务
	public static final String SERV_STAGE_DEFAULT = "stageDefault";
	// 商店服务
	public static final String SERV_SHOP = "shop";
	// 邮件服务
	public static final String SERV_MAIL = "mail";
	// 排行榜服务
	public static final String SERV_RANK = "rank";
	// 组队服务
	public static final String SERV_TEAM = "team";
	// 联盟服务
	public static final String SERV_UNION = "union";
	// 活动服务
	public static final String SERV_ACTIVITY = "activity";
	// 竞技场服务
	public static final String SERV_ARENA = "arena";
	// 好友服务
	public static final String SERV_FRIEND = "friend";
	

	
	
	
	/**
	 * 获取node的监听地址
	 * @param nodeId
	 * @return
	 */
	public static String getNodeAddr(String nodeId) {
		return NODE_ADDR.get(nodeId);
	}
	
	/**
	 * 通过portId获取父nodeId
	 * @param portId
	 * @return
	 */
	public static String getNodeId(String portId) {
		return PORT_STARTWITH.get(portId);
	}
	
	/**
	 * 通过servId获取父portId
	 * @param servId
	 * @return
	 */
	public static String getPortId(String servId) {
		return SERV_STARTWITH.get(servId);
	}
	
	/**
	 * 通过node来获取子节点port集合
	 * @param nodeId
	 * @return
	 */
	public static List<String> getPortIds(String nodeId) {
		List<String> ids = new ArrayList<>();
		for(Entry<String, String> entry : PORT_STARTWITH.entrySet()) {
			if(entry.getValue().equals(nodeId)) {
				ids.add(entry.getKey());
			}
		}
		
		return ids;
	}
	
	/**
	 * 通过port来获取子节点serv集合
	 * @param portId
	 * @return
	 */
	public static List<String> getServIds(String portId) {
		List<String> ids = new ArrayList<>();
		for(Entry<String, String> entry : SERV_STARTWITH.entrySet()) {
			if(entry.getValue().equals(portId)) {
				ids.add(entry.getKey());
			}
		}
		
		return ids;
	}
	
	private static void readConfig(Properties prop) {
		// 遍历配置
		for(Entry<Object, Object> entry : prop.entrySet()) {
			String pk = (String)entry.getKey();
			String pv = (String)entry.getValue();
			
			// 分解key为前缀和关键字
			int lastIndexPoint = pk.lastIndexOf(".");
			String prefix = pk.substring(0, lastIndexPoint);
			String key = pk.substring(lastIndexPoint + 1);
			
			// node地址配置
			if(PREFIX_NODE_ADDR.equals(prefix)) {
				NODE_ADDR.put(key, pv);
			// port启动配置
			} else if(PREFIX_PORT_STARTWITH.equals(prefix)) {
				PORT_STARTWITH.put(key, pv);
			// service启动配置
			} else if(PREFIX_SERV_STARTWITH.equals(prefix)) {
				SERV_STARTWITH.put(key, pv);
			}
		}
	}
}
